//
//  JsonHandler.swift
//  TestWorkSpace
//
//  Created by Mac on 2020/1/7.
//  Copyright © 2020 jhf. All rights reserved.
//

import Foundation

// model 转 json

/// 自定义一个JSON协议
protocol JSONProtocol {
    func toJSONModel() -> AnyObject?
    func toJSONString() -> String?
}

/// 扩展协议方法
extension JSONProtocol {
    /// 将数据转成可用的JSON模型
    func toJSONModel() -> AnyObject? {
        let mirror = Mirror(reflecting: self)
        if mirror.children.count > 0  {
            var result: [String:AnyObject] = [:]
            for case let (label?, value) in mirror.children {
                /// print("属性：\(label)     值：\(value)")
                if let jsonValue = value as? JSONProtocol {
                    result[label] = jsonValue.toJSONModel()
                }
            }
             
            return result as AnyObject
        }
        return self as AnyObject
    }
     
    /// 将数据转成JSON字符串
    func toJSONString() -> String? {
        let jsonModel = self.toJSONModel()
        /// 利用OC的json库转换成Data，
        let data = try? JSONSerialization.data(withJSONObject: jsonModel!,
                                                                         options: [])
        /// Data转换成String打印输出
        let str = String(data: data!, encoding: .utf8)
        return str
    }
}
 
/// 扩展可选类型，使其遵循JSON协议
extension Optional: JSONProtocol {
    /// 可选类型重写toJSONModel()方法
    func toJSONModel() -> AnyObject? {
        if let x = self {
            if let value = x as? JSONProtocol {
                return value.toJSONModel()
            }
        }
        return nil
    }
}
 
/// 扩展Swift的基本数据类型，使其遵循JSON协议
extension String: JSONProtocol { }
extension Int: JSONProtocol { }
extension Bool: JSONProtocol { }
extension Dictionary: JSONProtocol { }
extension Double: JSONProtocol { }
 
/// 扩展Array，格式化输出
extension Array: JSONProtocol {
    /// 将数据转成可用的JSON模型
    func toJSONModel() -> AnyObject? {
        var result: [AnyObject] = []
        for value in self {
            if let jsonValue = value as? JSONProtocol , let jsonModel = jsonValue.toJSONModel(){
                result.append(jsonModel)
            }
        }
        return result as AnyObject
    }
}
 
/// 扩展Date日期类型，格式化输出
extension Date: JSONProtocol {
    /// 将数据转成可用的JSON模型
    func toJSONModel() -> AnyObject? {
        /// 创建一个日期格式器
        let dformatter = DateFormatter()
        /// 为日期格式器设置格式字符串
        dformatter.dateFormat = "yyyy年MM月dd日 HH:mm:ss"
        /// 使用日期格式器格式化日期、时间
        let datestr = dformatter.string(from: self)
        return datestr as AnyObject
    }
}
